﻿using SIIE_ERP.BaseDatos.Configuracion;
using SIIE_ERP.BaseDatos.Configuracion.Empresa;
using SIIE_ERP.BaseDatos.Ventas.Catalogos;
using SIIE_ERP.Codigo;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SIIE_ERP.BaseDatos.Ventas
{
    public class DocumentoFE
    {
        #region Propiedades

        private string _RFC;
        private string _Usuario;

        #endregion

        #region Constructores

        public DocumentoFE(string RFC, string Usuario)
        {
            this._RFC = RFC;
            this._Usuario = Usuario;
        }

        #endregion

        /// <summary>
        /// Si el cliente contiene todos los campos requeridos el método regresa una cadena vacía en caso contrario regresa los campos necesarios faltantes
        /// </summary>
        /// <param name="Id_Documento"></param>
        /// <param name="Tipo_Documento"></param>
        /// <returns></returns>
        public string HasDatosCliente
        (
            int Id_Documento,
            Documentos_Id Tipo_Documento
        )
        {
            string Tabla = "";
            string Id = "";

            if (Tipo_Documento == Documentos_Id.Doc_FacturaCliente)
            {
                Tabla = "dbo_Trans_Factura_Cliente_Cab";
                Id = "Id_Factura_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_DevolucionCliente)
            {
                Tabla = "dbo_Trans_Devolucion_Cliente_Cab";
                Id = "Id_Devolucion_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_NotaCreditoCliente)
            {
                Tabla = "dbo_Trans_Nota_Credito_Cliente_Cab";
                Id = "Id_Nota_Credito_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_ReciboArrendamientoVentas)
            {
                Tabla = "dbo_Trans_ReciboArrendamiento_Cliente_Cab";
                Id = "Id_ReciboArrendamiento_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_ReciboHonorariosVentas)
            {
                Tabla = "dbo_Trans_ReciboHonorarios_Cliente_Cab";
                Id = "Id_ReciboHonorarios_Cliente";
            }   

            string Query = "SELECT * FROM @@Tabla WHERE @@Id_Documento = @@Id";
            Query = Query.Replace("@@Id_Documento", Id);
            Query = Query.Replace("@@Id", Id_Documento.ToString());            
            Query = Query.Replace("@@Tabla", Tabla);

            string Id_Cliente = SrvDB.ExecuteQuery_Get(Query).Rows[0]["Id_Cliente"].ToString();

            dbo_Cat_Cliente C = new dbo_Cat_Cliente(_RFC, _Usuario);
            DataTable dt_Cliente = C.Get_Clientes_Por_Id(Id_Cliente);

            string resultado = "";

            if (String.IsNullOrEmpty(dt_Cliente.Rows[0]["Calle"].ToString()))
                resultado += "Calle, ";
            if (String.IsNullOrEmpty(dt_Cliente.Rows[0]["Municipio"].ToString()))
                resultado += "Municipio, ";
            if (String.IsNullOrEmpty(dt_Cliente.Rows[0]["Id_Estado"].ToString()))
                resultado += "Estado, ";
            if (String.IsNullOrEmpty(dt_Cliente.Rows[0]["Id_Pais"].ToString()))
                resultado += "Pais, ";
            if (String.IsNullOrEmpty(dt_Cliente.Rows[0]["CP"].ToString()))
                resultado += "Código Postal, ";
            if (String.IsNullOrEmpty(dt_Cliente.Rows[0]["Num_Ext"].ToString()))
                resultado += "Número Exterior, ";
            if (String.IsNullOrEmpty(dt_Cliente.Rows[0]["Colonia"].ToString()))
                resultado += "Colonia, ";
            if (String.IsNullOrEmpty(dt_Cliente.Rows[0]["Razon_Social"].ToString()))
                resultado += "Razon_Social, ";
            
            if(resultado.Length > 0)
                resultado = resultado.Remove(resultado.Length - 2);

            return resultado;
        }

        public string HasDatosEmisor
        (
            int Id_Documento,
            Documentos_Id Tipo_Documento
        )
        {
            string Tabla = "";
            string Id = "";

            if (Tipo_Documento == Documentos_Id.Doc_FacturaCliente)
            {
                Tabla = "dbo_Trans_Factura_Cliente_Cab";
                Id = "Id_Factura_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_DevolucionCliente)
            {
                Tabla = "dbo_Trans_Devolucion_Cliente_Cab";
                Id = "Id_Devolucion_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_NotaCreditoCliente)
            {
                Tabla = "dbo_Trans_Nota_Credito_Cliente_Cab";
                Id = "Id_Nota_Credito_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_ReciboArrendamientoVentas)
            {
                Tabla = "dbo_Trans_ReciboArrendamiento_Cliente_Cab";
                Id = "Id_ReciboArrendamiento_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_ReciboHonorariosVentas)
            {
                Tabla = "dbo_Trans_ReciboHonorarios_Cliente_Cab";
                Id = "Id_ReciboHonorarios_Cliente";
            }

            string Query = "SELECT * FROM @@Tabla WHERE @@Id_Documento = @@Id";
            Query = Query.Replace("@@Id_Documento", Id);
            Query = Query.Replace("@@Id", Id_Documento.ToString());
            Query = Query.Replace("@@Tabla", Tabla);

            string Id_Sucursal = SrvDB.ExecuteQuery_Get(Query).Rows[0]["Id_Sucursal"].ToString();

            dbo_Cat_Sucursal C = new dbo_Cat_Sucursal(_RFC, _Usuario);
            DataTable dt_Sucursal = C.Get_Sucursal_Por_Id(Id_Sucursal);

            dbo_Cat_Empresa E = new dbo_Cat_Empresa(_RFC, _Usuario);
            DataTable dt_Empresa = E.Get_Empresas();

            string resultado = "";

            if (String.IsNullOrEmpty(dt_Sucursal.Rows[0]["Calle"].ToString()))
                resultado += "Calle, ";
            if (String.IsNullOrEmpty(dt_Sucursal.Rows[0]["Municipio"].ToString()))
                resultado += "Municipio, ";
            if (String.IsNullOrEmpty(dt_Sucursal.Rows[0]["Id_Estado"].ToString()))
                resultado += "Estado, ";
            if (String.IsNullOrEmpty(dt_Sucursal.Rows[0]["Id_Pais"].ToString()))
                resultado += "Pais, ";
            if (String.IsNullOrEmpty(dt_Sucursal.Rows[0]["CP"].ToString()))
                resultado += "Código Postal, ";
            if (String.IsNullOrEmpty(dt_Sucursal.Rows[0]["Num_Ext"].ToString()))
                resultado += "Número Exterior, ";
            if (String.IsNullOrEmpty(dt_Sucursal.Rows[0]["Colonia"].ToString()))
                resultado += "Colonia, ";
            if (String.IsNullOrEmpty(dt_Empresa.Rows[0]["Razon_Social"].ToString()))
                resultado += "Razon_Social, ";

            if (resultado.Length > 0)
                resultado = resultado.Remove(resultado.Length - 2);

            return resultado;
        }

        public static int Next_CFDI_Comprobante()
        {
            return Int32.Parse(SrvDB.ExecuteQuery_Get("SELECT IIF(DCount('*', 'dbo_CFDI_Comprobante') = 0, 1, DMax('Id_CFDI_Comprobante', 'dbo_CFDI_Comprobante') + 1)").Rows[0][0].ToString());
        }

        public static int Next_CFDI_Concepto()
        {
            return Int32.Parse(SrvDB.ExecuteQuery_Get("SELECT IIF(DCount('*', 'dbo_CFDI_Concepto') = 0, 1, DMax('Id_CFDI_Concepto', 'dbo_CFDI_Concepto') + 1)").Rows[0][0].ToString());
        }

        public static int Next_CFDI_Domicilio()
        {
            return Int32.Parse(SrvDB.ExecuteQuery_Get("SELECT IIF(DCount('*', 'dbo_CFDI_Domicilio') = 0, 1, DMax('Id_CFDI_Domicilio', 'dbo_CFDI_Domicilio') + 1)").Rows[0][0].ToString());
        }

        public static int Next_CFDI_DomicilioFiscal()
        {
            return Int32.Parse(SrvDB.ExecuteQuery_Get("SELECT IIF(DCount('*', 'dbo_CFDI_DomicilioFiscal') = 0, 1, DMax('Id_CFDI_DomicilioFiscal', 'dbo_CFDI_DomicilioFiscal') + 1)").Rows[0][0].ToString());
        }

        public static int Next_CFDI_Emisor()
        {
            return Int32.Parse(SrvDB.ExecuteQuery_Get("SELECT IIF(DCount('*', 'dbo_CFDI_Emisor') = 0, 1, DMax('Id_CFDI_Emisor', 'dbo_CFDI_Emisor') + 1)").Rows[0][0].ToString());
        }

        public static int Next_CFDI_Receptor()
        {
            return Int32.Parse(SrvDB.ExecuteQuery_Get("SELECT IIF(DCount('*', 'dbo_CFDI_Receptor') = 0, 1, DMax('Id_CFDI_Receptor', 'dbo_CFDI_Receptor') + 1)").Rows[0][0].ToString());
        }

        public static int Next_CFDI_RegimenFiscal()
        {
            return Int32.Parse(SrvDB.ExecuteQuery_Get("SELECT IIF(DCount('*', 'dbo_CFDI_RegimenFiscal') = 0, 1, DMax('Id_CFDI_RegimenFiscal', 'dbo_CFDI_RegimenFiscal') + 1)").Rows[0][0].ToString());
        }

        public static int Next_CFDI_Retencion()
        {
            return Int32.Parse(SrvDB.ExecuteQuery_Get("SELECT IIF(DCount('*', 'dbo_CFDI_Retencion') = 0, 1, DMax('Id_CFDI_Retencion', 'dbo_CFDI_Retencion') + 1)").Rows[0][0].ToString());
        }

        public static int Next_CFDI_TimbreFiscalDigital()
        {
            return Int32.Parse(SrvDB.ExecuteQuery_Get("SELECT IIF(DCount('*', 'dbo_CFDI_TimbreFiscalDigital') = 0, 1, DMax('Id_CFDI_TimbreFiscalDigital', 'dbo_CFDI_TimbreFiscalDigital') + 1)").Rows[0][0].ToString());
        }

        public static int Next_CFDI_Traslado()
        {
            return Int32.Parse(SrvDB.ExecuteQuery_Get("SELECT IIF(DCount('*', 'dbo_CFDI_Traslado') = 0, 1, DMax('Id_CFDI_Traslado', 'dbo_CFDI_Traslado') + 1)").Rows[0][0].ToString());
        }

        public static Respuesta Insert_CFDI_Comprobante(OleDbCommand cmd)
        {
            OleDbCommand cmd2 = new OleDbCommand();

            cmd2.CommandText = @"
                	INSERT INTO dbo_CFDI_Comprobante (
	
		                [Id_CFDI_Comprobante],
		                [Id_Documento],
		                [Id_TipoDocumento],
		                [xmlns_xsi],
		                [xsi_schemaLocation],
		                [Version],
		                [Serie],
		                [Folio],
		                [Fecha],
		                [Sello],
		                [FormaDePago],
		                [NoCertificado],
		                [Certificado],
		                [CondicionesDePago],
		                [SubTotal],
		                [Descuento],
		                [MotivoDescuento],
		                [TipoCambio],
		                [Moneda],
		                [Total],
		                [TipoDeComprobante],
		                [MetodoDePago],
		                [LugarExpedicion],
		                [NumCtaPago],
		                [FolioFiscalOrig],
		                [SerieFolioFiscalOrig],
		                [FechaFolioFiscalOrig],
		                [MontoFolioFiscalOrig],
		                [xmlns_cfdi]
	                ) VALUES (
	
		                @Id_CFDI_Comprobante,
		                @Id_Documento,
		                @Id_TipoDocumento,
		                @xmlns_xsi,
		                @xsi_schemaLocation,
		                @Version,
		                @Serie,
		                @Folio,
		                @Fecha,
		                @Sello,
		                @FormaDePago,
		                @NoCertificado,
		                @Certificado,
		                @CondicionesDePago,
		                @SubTotal,
		                @Descuento,
		                @MotivoDescuento,
		                @TipoCambio,
		                @Moneda,
		                @Total,
		                @TipoDeComprobante,
		                @MetodoDePago,
		                @LugarExpedicion,
		                @NumCtaPago,
		                @FolioFiscalOrig,
		                @SerieFolioFiscalOrig,
		                @FechaFolioFiscalOrig,
		                @MontoFolioFiscalOrig,
		                @xmlns_cfdi	
	                )
            ";

            if (!cmd.Parameters.Contains("@Id_CFDI_Comprobante"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_Comprobante", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_Comprobante", cmd.Parameters["@Id_CFDI_Comprobante"].Value);

            if (!cmd.Parameters.Contains("@Id_Documento"))
                cmd2.Parameters.AddWithValue("@Id_Documento", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_Documento", cmd.Parameters["@Id_Documento"].Value);

            if (!cmd.Parameters.Contains("@Id_TipoDocumento"))
                cmd2.Parameters.AddWithValue("@Id_TipoDocumento", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_TipoDocumento", cmd.Parameters["@Id_TipoDocumento"].Value);

            if (!cmd.Parameters.Contains("@xmlns_xsi"))
                cmd2.Parameters.AddWithValue("@xmlns_xsi", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@xmlns_xsi", cmd.Parameters["@xmlns_xsi"].Value);

            if (!cmd.Parameters.Contains("@xsi_schemaLocation"))
                cmd2.Parameters.AddWithValue("@xsi_schemaLocation", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@xsi_schemaLocation", cmd.Parameters["@xsi_schemaLocation"].Value);

            if (!cmd.Parameters.Contains("@Version"))
                cmd2.Parameters.AddWithValue("@Version", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Version", cmd.Parameters["@Version"].Value);

            if (!cmd.Parameters.Contains("@Serie"))
                cmd2.Parameters.AddWithValue("@Serie", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Serie", cmd.Parameters["@Serie"].Value);

            if (!cmd.Parameters.Contains("@Folio"))
                cmd2.Parameters.AddWithValue("@Folio", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Folio", cmd.Parameters["@Folio"].Value);

            if (!cmd.Parameters.Contains("@Fecha"))
                cmd2.Parameters.AddWithValue("@Fecha", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Fecha", cmd.Parameters["@Fecha"].Value);

            if (!cmd.Parameters.Contains("@Sello"))
                cmd2.Parameters.AddWithValue("@Sello", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Sello", cmd.Parameters["@Sello"].Value);

            if (!cmd.Parameters.Contains("@FormaDePago"))
                cmd2.Parameters.AddWithValue("@FormaDePago", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@FormaDePago", cmd.Parameters["@FormaDePago"].Value);

            if (!cmd.Parameters.Contains("@NoCertificado"))
                cmd2.Parameters.AddWithValue("@NoCertificado", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@NoCertificado", cmd.Parameters["@NoCertificado"].Value);

            if (!cmd.Parameters.Contains("@Certificado"))
                cmd2.Parameters.AddWithValue("@Certificado", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Certificado", cmd.Parameters["@Certificado"].Value);

            if (!cmd.Parameters.Contains("@CondicionesDePago"))
                cmd2.Parameters.AddWithValue("@CondicionesDePago", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@CondicionesDePago", cmd.Parameters["@CondicionesDePago"].Value);

            if (!cmd.Parameters.Contains("@SubTotal"))
                cmd2.Parameters.AddWithValue("@SubTotal", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@SubTotal", cmd.Parameters["@SubTotal"].Value);

            if (!cmd.Parameters.Contains("@Descuento"))
                cmd2.Parameters.AddWithValue("@Descuento", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Descuento", cmd.Parameters["@Descuento"].Value);

            if (!cmd.Parameters.Contains("@MotivoDescuento"))
                cmd2.Parameters.AddWithValue("@MotivoDescuento", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@MotivoDescuento", cmd.Parameters["@MotivoDescuento"].Value);

            if (!cmd.Parameters.Contains("@TipoCambio"))
                cmd2.Parameters.AddWithValue("@TipoCambio", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@TipoCambio", cmd.Parameters["@TipoCambio"].Value);

            if (!cmd.Parameters.Contains("@Moneda"))
                cmd2.Parameters.AddWithValue("@Moneda", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Moneda", cmd.Parameters["@Moneda"].Value);

            if (!cmd.Parameters.Contains("@Total"))
                cmd2.Parameters.AddWithValue("@Total", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Total", cmd.Parameters["@Total"].Value);

            if (!cmd.Parameters.Contains("@TipoDeComprobante"))
                cmd2.Parameters.AddWithValue("@TipoDeComprobante", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@TipoDeComprobante", cmd.Parameters["@TipoDeComprobante"].Value);

            if (!cmd.Parameters.Contains("@MetodoDePago"))
                cmd2.Parameters.AddWithValue("@MetodoDePago", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@MetodoDePago", cmd.Parameters["@MetodoDePago"].Value);

            if (!cmd.Parameters.Contains("@LugarExpedicion"))
                cmd2.Parameters.AddWithValue("@LugarExpedicion", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@LugarExpedicion", cmd.Parameters["@LugarExpedicion"].Value);

            if (!cmd.Parameters.Contains("@NumCtaPago"))
                cmd2.Parameters.AddWithValue("@NumCtaPago", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@NumCtaPago", cmd.Parameters["@NumCtaPago"].Value);

            if (!cmd.Parameters.Contains("@FolioFiscalOrig"))
                cmd2.Parameters.AddWithValue("@FolioFiscalOrig", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@FolioFiscalOrig", cmd.Parameters["@FolioFiscalOrig"].Value);

            if (!cmd.Parameters.Contains("@SerieFolioFiscalOrig"))
                cmd2.Parameters.AddWithValue("@SerieFolioFiscalOrig", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@SerieFolioFiscalOrig", cmd.Parameters["@SerieFolioFiscalOrig"].Value);

            if (!cmd.Parameters.Contains("@FechaFolioFiscalOrig"))
                cmd2.Parameters.AddWithValue("@FechaFolioFiscalOrig", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@FechaFolioFiscalOrig", cmd.Parameters["@FechaFolioFiscalOrig"].Value);

            if (!cmd.Parameters.Contains("@MontoFolioFiscalOrig"))
                cmd2.Parameters.AddWithValue("@MontoFolioFiscalOrig", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@MontoFolioFiscalOrig", cmd.Parameters["@MontoFolioFiscalOrig"].Value);

            if (!cmd.Parameters.Contains("@xmlns_cfdi"))
                cmd2.Parameters.AddWithValue("@xmlns_cfdi", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@xmlns_cfdi", cmd.Parameters["@xmlns_cfdi"].Value);
            
            return SrvDB.ExecuteQuery_Insert(cmd2);
        }

        public static Respuesta Insert_CFDI_Concepto(OleDbCommand cmd)
        {
            OleDbCommand cmd2 = new OleDbCommand();

            cmd2.CommandText = @"
                INSERT INTO dbo_CFDI_Concepto (
		            [Id_CFDI_Concepto],
		            [Id_CFDI_Comprobante],
		            [Cantidad],
		            [Unidad],
		            [NoIdentificacion],
		            [Descripcion],
		            [ValorUnitario],
		            [Importe]
	            ) VALUES (
		            @Id_CFDI_Concepto,
		            @Id_CFDI_Comprobante,
		            @Cantidad,
		            @Unidad,
		            @NoIdentificacion,
		            @Descripcion,
		            @ValorUnitario,
		            @Importe
	            )
            ";

            if (!cmd.Parameters.Contains("@Id_CFDI_Concepto"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_Concepto", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_Concepto", cmd.Parameters["@Id_CFDI_Concepto"].Value);

            if (!cmd.Parameters.Contains("@Id_CFDI_Comprobante"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_Comprobante", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_Comprobante", cmd.Parameters["@Id_CFDI_Comprobante"].Value);

            if (!cmd.Parameters.Contains("@Cantidad"))
                cmd2.Parameters.AddWithValue("@Cantidad", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Cantidad", cmd.Parameters["@Cantidad"].Value);

            if (!cmd.Parameters.Contains("@Unidad"))
                cmd2.Parameters.AddWithValue("@Unidad", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Unidad", cmd.Parameters["@Unidad"].Value);

            if (!cmd.Parameters.Contains("@NoIdentificacion"))
                cmd2.Parameters.AddWithValue("@NoIdentificacion", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@NoIdentificacion", cmd.Parameters["@NoIdentificacion"].Value);

            if (!cmd.Parameters.Contains("@Descripcion"))
                cmd2.Parameters.AddWithValue("@Descripcion", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Descripcion", cmd.Parameters["@Descripcion"].Value);

            if (!cmd.Parameters.Contains("@ValorUnitario"))
                cmd2.Parameters.AddWithValue("@ValorUnitario", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@ValorUnitario", cmd.Parameters["@ValorUnitario"].Value);

            if (!cmd.Parameters.Contains("@Importe"))
                cmd2.Parameters.AddWithValue("@Importe", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Importe", cmd.Parameters["@Importe"].Value);


            return SrvDB.ExecuteQuery_Insert(cmd2);
        }

        public static Respuesta Insert_CFDI_Domicilio(OleDbCommand cmd)
        {
            OleDbCommand cmd2 = new OleDbCommand();

            cmd2.CommandText = @"
                INSERT INTO dbo_CFDI_Domicilio (
		            [Id_CFDI_Domicilio],
		            [Id_CFDI_Receptor],
		            [Calle],
		            [NoExterior],
                    [NoInterior],
		            [Colonia],
		            [Localidad],
		            [Referencia],
		            [Municipio],
		            [Estado],
		            [País],
		            [CodigoPostal]

	            ) VALUES (
		            @Id_CFDI_Domicilio,
		            @Id_CFDI_Receptor,
		            @Calle,
		            @NoExterior,	
                    @NoInterior,	            
		            @Colonia,
		            @Localidad,
		            @Referencia,
		            @Municipio,
		            @Estado,
		            @País,
		            @CodigoPostal
	            )
            ";

            if (!cmd.Parameters.Contains("@Id_CFDI_Domicilio"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_Domicilio", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_Domicilio", cmd.Parameters["@Id_CFDI_Domicilio"].Value);

            if (!cmd.Parameters.Contains("@Id_CFDI_Receptor"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_Receptor", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_Receptor", cmd.Parameters["@Id_CFDI_Receptor"].Value);

            if (!cmd.Parameters.Contains("@Calle"))
                cmd2.Parameters.AddWithValue("@Calle", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Calle", cmd.Parameters["@Calle"].Value);

            if (!cmd.Parameters.Contains("@NoExterior"))
                cmd2.Parameters.AddWithValue("@NoExterior", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@NoExterior", cmd.Parameters["@NoExterior"].Value);

            if (!cmd.Parameters.Contains("@NoInterior"))
                cmd2.Parameters.AddWithValue("@NoInterior", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@NoInterior", cmd.Parameters["@NoInterior"].Value);

            if (!cmd.Parameters.Contains("@Colonia"))
                cmd2.Parameters.AddWithValue("@Colonia", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Colonia", cmd.Parameters["@Colonia"].Value);

            if (!cmd.Parameters.Contains("@Localidad"))
                cmd2.Parameters.AddWithValue("@Localidad", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Localidad", cmd.Parameters["@Localidad"].Value);

            if (!cmd.Parameters.Contains("@Referencia"))
                cmd2.Parameters.AddWithValue("@Referencia", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Referencia", cmd.Parameters["@Referencia"].Value);

            if (!cmd.Parameters.Contains("@Municipio"))
                cmd2.Parameters.AddWithValue("@Municipio", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Municipio", cmd.Parameters["@Municipio"].Value);

            if (!cmd.Parameters.Contains("@Estado"))
                cmd2.Parameters.AddWithValue("@Estado", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Estado", cmd.Parameters["@Estado"].Value);

            if (!cmd.Parameters.Contains("@País"))
                cmd2.Parameters.AddWithValue("@País", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@País", cmd.Parameters["@País"].Value);

            if (!cmd.Parameters.Contains("@CodigoPostal"))
                cmd2.Parameters.AddWithValue("@CodigoPostal", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@CodigoPostal", cmd.Parameters["@CodigoPostal"].Value);
                  
            return SrvDB.ExecuteQuery_Insert(cmd2);
        }

        public static Respuesta Insert_CFDI_DomicilioFiscal(OleDbCommand cmd)
        {
            OleDbCommand cmd2 = new OleDbCommand();

            cmd2.CommandText = @"
	            INSERT INTO dbo_CFDI_DomicilioFiscal (
		            [Id_CFDI_DomicilioFiscal],
		            [Id_CFDI_Emisor],
		            [Calle],
		            [NoExterior],
                    [NoInterior],
		            [Colonia],
		            [Localidad],
		            [Referencia],
		            [Municipio],
		            [Estado],
		            [País],
		            [CodigoPostal]

	            ) VALUES (
		            @Id_CFDI_DomicilioFiscal,
		            @Id_CFDI_Emisor,
		            @Calle,
		            @NoExterior,
                    @NoInterior,	            
		            @Colonia,
		            @Localidad,
		            @Referencia,
		            @Municipio,
		            @Estado,
		            @País,
		            @CodigoPostal
	            )
            ";

            if (!cmd.Parameters.Contains("@Id_CFDI_DomicilioFiscal"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_DomicilioFiscal", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_DomicilioFiscal", cmd.Parameters["@Id_CFDI_DomicilioFiscal"].Value);

            if (!cmd.Parameters.Contains("@Id_CFDI_Emisor"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_Emisor", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_Emisor", cmd.Parameters["@Id_CFDI_Emisor"].Value);

            if (!cmd.Parameters.Contains("@Calle"))
                cmd2.Parameters.AddWithValue("@Calle", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Calle", cmd.Parameters["@Calle"].Value);

            if (!cmd.Parameters.Contains("@NoExterior"))
                cmd2.Parameters.AddWithValue("@NoExterior", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@NoExterior", cmd.Parameters["@NoExterior"].Value);

            if (!cmd.Parameters.Contains("@NoInterior"))
                cmd2.Parameters.AddWithValue("@NoInterior", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@NoInterior", cmd.Parameters["@NoInterior"].Value);

            if (!cmd.Parameters.Contains("@Colonia"))
                cmd2.Parameters.AddWithValue("@Colonia", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Colonia", cmd.Parameters["@Colonia"].Value);

            if (!cmd.Parameters.Contains("@Localidad"))
                cmd2.Parameters.AddWithValue("@Localidad", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Localidad", cmd.Parameters["@Localidad"].Value);

            if (!cmd.Parameters.Contains("@Referencia"))
                cmd2.Parameters.AddWithValue("@Referencia", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Referencia", cmd.Parameters["@Referencia"].Value);

            if (!cmd.Parameters.Contains("@Municipio"))
                cmd2.Parameters.AddWithValue("@Municipio", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Municipio", cmd.Parameters["@Municipio"].Value);

            if (!cmd.Parameters.Contains("@Estado"))
                cmd2.Parameters.AddWithValue("@Estado", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Estado", cmd.Parameters["@Estado"].Value);

            if (!cmd.Parameters.Contains("@País"))
                cmd2.Parameters.AddWithValue("@País", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@País", cmd.Parameters["@País"].Value);

            if (!cmd.Parameters.Contains("@CodigoPostal"))
                cmd2.Parameters.AddWithValue("@CodigoPostal", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@CodigoPostal", cmd.Parameters["@CodigoPostal"].Value);
                  
            return SrvDB.ExecuteQuery_Insert(cmd2);
        }

        public static Respuesta Insert_CFDI_Emisor(OleDbCommand cmd)
        {
            OleDbCommand cmd2 = new OleDbCommand();

            cmd2.CommandText = @"
                INSERT INTO dbo_CFDI_Emisor (
		            [Id_CFDI_Emisor],
		            [Id_CFDI_Comprobante],
		            [RFC],
		            [Nombre]

	            ) VALUES (
		            @Id_CFDI_Emisor,
		            @Id_CFDI_Comprobante,
		            @RFC,
		            @Nombre
	            )
            ";

            if (!cmd.Parameters.Contains("@Id_CFDI_Emisor"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_Emisor", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_Emisor", cmd.Parameters["@Id_CFDI_Emisor"].Value);

            if (!cmd.Parameters.Contains("@Id_CFDI_Comprobante"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_Comprobante", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_Comprobante", cmd.Parameters["@Id_CFDI_Comprobante"].Value);

            if (!cmd.Parameters.Contains("@RFC"))
                cmd2.Parameters.AddWithValue("@RFC", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@RFC", cmd.Parameters["@RFC"].Value);

            if (!cmd.Parameters.Contains("@Nombre"))
                cmd2.Parameters.AddWithValue("@Nombre", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Nombre", cmd.Parameters["@Nombre"].Value);
                  

            return SrvDB.ExecuteQuery_Insert(cmd2);
        }

        public static Respuesta Insert_CFDI_Receptor(OleDbCommand cmd)
        {
            OleDbCommand cmd2 = new OleDbCommand();

            cmd2.CommandText = @"
                INSERT INTO dbo_CFDI_Receptor (
		            [Id_CFDI_Receptor],
		            [Id_CFDI_Comprobante],
		            [RFC],
		            [Nombre]

	            ) VALUES (
		            @Id_CFDI_Receptor,
		            @Id_CFDI_Comprobante,
		            @RFC,
		            @Nombre
	            )
            ";

            if (!cmd.Parameters.Contains("@Id_CFDI_Receptor"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_Receptor", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_Receptor", cmd.Parameters["@Id_CFDI_Receptor"].Value);

            if (!cmd.Parameters.Contains("@Id_CFDI_Comprobante"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_Comprobante", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_Comprobante", cmd.Parameters["@Id_CFDI_Comprobante"].Value);

            if (!cmd.Parameters.Contains("@RFC"))
                cmd2.Parameters.AddWithValue("@RFC", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@RFC", cmd.Parameters["@RFC"].Value);

            if (!cmd.Parameters.Contains("@Nombre"))
                cmd2.Parameters.AddWithValue("@Nombre", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Nombre", cmd.Parameters["@Nombre"].Value);
            
            return SrvDB.ExecuteQuery_Insert(cmd2);
        }

        public static Respuesta Insert_CFDI_RegimenFiscal(OleDbCommand cmd)
        {
            OleDbCommand cmd2 = new OleDbCommand();

            cmd2.CommandText = @"
                INSERT INTO dbo_CFDI_RegimenFiscal (
		            [Id_CFDI_RegimenFiscal],
		            [Id_CFDI_Emisor],
		            [Regimen]

	            ) VALUES (
		            @Id_CFDI_RegimenFiscal,
		            @Id_CFDI_Emisor,
		            @Regimen
	            )
            ";

            if (!cmd.Parameters.Contains("@Id_CFDI_RegimenFiscal"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_RegimenFiscal", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_RegimenFiscal", cmd.Parameters["@Id_CFDI_RegimenFiscal"].Value);

            if (!cmd.Parameters.Contains("@Id_CFDI_Emisor"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_Emisor", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_Emisor", cmd.Parameters["@Id_CFDI_Emisor"].Value);

            if (!cmd.Parameters.Contains("@Regimen"))
                cmd2.Parameters.AddWithValue("@Regimen", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Regimen", cmd.Parameters["@Regimen"].Value);

            return SrvDB.ExecuteQuery_Insert(cmd2);
        }

        public static Respuesta Insert_CFDI_Retencion(OleDbCommand cmd)
        {
            OleDbCommand cmd2 = new OleDbCommand();

            cmd2.CommandText = @"
                INSERT INTO dbo_CFDI_Retencion (
		            [Id_CFDI_Comprobante],
		            [Id_CFDI_Retencion],
		            [Impuesto],
		            [Importe]

	            ) VALUES (
		            @Id_CFDI_Comprobante,
		            @Id_CFDI_Retencion,
		            @Impuesto,
		            @Importe
	            )
            ";

            if (!cmd.Parameters.Contains("@Id_CFDI_Comprobante"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_Comprobante", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_Comprobante", cmd.Parameters["@Id_CFDI_Comprobante"].Value);

            if (!cmd.Parameters.Contains("@Id_CFDI_Retencion"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_Retencion", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_Retencion", cmd.Parameters["@Id_CFDI_Retencion"].Value);

            if (!cmd.Parameters.Contains("@Impuesto"))
                cmd2.Parameters.AddWithValue("@Impuesto", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Impuesto", cmd.Parameters["@Impuesto"].Value);

            if (!cmd.Parameters.Contains("@Importe"))
                cmd2.Parameters.AddWithValue("@Importe", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Importe", cmd.Parameters["@Importe"].Value);

            return SrvDB.ExecuteQuery_Insert(cmd2);
        }

        public static Respuesta Insert_CFDI_TimbreFiscalDigital(OleDbCommand cmd)
        {
            OleDbCommand cmd2 = new OleDbCommand();

            cmd2.CommandText = @"
                INSERT INTO dbo_CFDI_TimbreFiscalDigital (
		            [Id_CFDI_TimbreFiscalDigital],
		            [Id_CFDI_Comprobante],
		            [xmlns_tfd],
		            [xsi_schemaLocation],
		            [Version],
		            [UUID],
		            [FechaTimbrado],
		            [selloCFD],
		            [NoCertificadoSAT],
		            [SelloSAT]
	            ) VALUES (
		            @Id_CFDI_TimbreFiscalDigital,
		            @Id_CFDI_Comprobante,
		            @xmlns_tfd,
		            @xsi_schemaLocation,
		            @Version,
		            @UUID,
		            @FechaTimbrado,
		            @selloCFD,
		            @NoCertificadoSAT,
		            @SelloSAT
	            )
            ";

            if (!cmd.Parameters.Contains("@Id_CFDI_TimbreFiscalDigital"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_TimbreFiscalDigital", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_TimbreFiscalDigital", cmd.Parameters["@Id_CFDI_TimbreFiscalDigital"].Value);

            if (!cmd.Parameters.Contains("@Id_CFDI_Comprobante"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_Comprobante", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_Comprobante", cmd.Parameters["@Id_CFDI_Comprobante"].Value);

            if (!cmd.Parameters.Contains("@xmlns_tfd"))
                cmd2.Parameters.AddWithValue("@xmlns_tfd", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@xmlns_tfd", cmd.Parameters["@xmlns_tfd"].Value);

            if (!cmd.Parameters.Contains("@xsi_schemaLocation"))
                cmd2.Parameters.AddWithValue("@xsi_schemaLocation", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@xsi_schemaLocation", cmd.Parameters["@xsi_schemaLocation"].Value);

            if (!cmd.Parameters.Contains("@Version"))
                cmd2.Parameters.AddWithValue("@Version", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Version", cmd.Parameters["@Version"].Value);

            if (!cmd.Parameters.Contains("@UUID"))
                cmd2.Parameters.AddWithValue("@UUID", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@UUID", cmd.Parameters["@UUID"].Value);

            if (!cmd.Parameters.Contains("@FechaTimbrado"))
                cmd2.Parameters.AddWithValue("@FechaTimbrado", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@FechaTimbrado", cmd.Parameters["@FechaTimbrado"].Value);

            if (!cmd.Parameters.Contains("@selloCFD"))
                cmd2.Parameters.AddWithValue("@selloCFD", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@selloCFD", cmd.Parameters["@selloCFD"].Value);

            if (!cmd.Parameters.Contains("@NoCertificadoSAT"))
                cmd2.Parameters.AddWithValue("@NoCertificadoSAT", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@NoCertificadoSAT", cmd.Parameters["@NoCertificadoSAT"].Value);

            if (!cmd.Parameters.Contains("@SelloSAT"))
                cmd2.Parameters.AddWithValue("@SelloSAT", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@SelloSAT", cmd.Parameters["@SelloSAT"].Value);

            return SrvDB.ExecuteQuery_Insert(cmd2);
        }

        public static Respuesta Insert_CFDI_Traslado(OleDbCommand cmd)
        {
            OleDbCommand cmd2 = new OleDbCommand();

            cmd2.CommandText = @"
                INSERT INTO dbo_CFDI_Traslado (
		            [Id_CFDI_Comprobante],
		            [Id_CFDI_Traslado],
		            [Impuesto],
		            [Tasa],
		            [Importe]
	            ) VALUES (
		            @Id_CFDI_Comprobante,
		            @Id_CFDI_Traslado,
		            @Impuesto,
		            @Tasa,
		            @Importe
	            )
            ";

            if (!cmd.Parameters.Contains("@Id_CFDI_Comprobante"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_Comprobante", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_Comprobante", cmd.Parameters["@Id_CFDI_Comprobante"].Value);

            if (!cmd.Parameters.Contains("@Id_CFDI_Traslado"))
                cmd2.Parameters.AddWithValue("@Id_CFDI_Traslado", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Id_CFDI_Traslado", cmd.Parameters["@Id_CFDI_Traslado"].Value);

            if (!cmd.Parameters.Contains("@Impuesto"))
                cmd2.Parameters.AddWithValue("@Impuesto", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Impuesto", cmd.Parameters["@Impuesto"].Value);

            if (!cmd.Parameters.Contains("@Tasa"))
                cmd2.Parameters.AddWithValue("@Tasa", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Tasa", cmd.Parameters["@Tasa"].Value);

            if (!cmd.Parameters.Contains("@Importe"))
                cmd2.Parameters.AddWithValue("@Importe", DBNull.Value);
            else
                cmd2.Parameters.AddWithValue("@Importe", cmd.Parameters["@Importe"].Value);


            return SrvDB.ExecuteQuery_Insert(cmd2);
        }

        public static Respuesta Insert_XML
        (
            Documentos_Id Tipo_Documento,
            int Id_Documento, 
            string XML
        )
        {
            string Tabla = "";
            string Id = "";

            if (Tipo_Documento == Documentos_Id.Doc_FacturaCliente)
            {
                Tabla = "dbo_Trans_Factura_Cliente_Cab";
                Id = "Id_Factura_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_DevolucionCliente)
            {
                Tabla = "dbo_Trans_Devolucion_Cliente_Cab";
                Id = "Id_Devolucion_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_NotaCreditoCliente)
            {
                Tabla = "dbo_Trans_Nota_Credito_Cliente_Cab";
                Id = "Id_Nota_Credito_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_ReciboArrendamientoVentas)
            {
                Tabla = "dbo_Trans_ReciboArrendamiento_Cliente_Cab";
                Id = "Id_ReciboArrendamiento_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_ReciboHonorariosVentas)
            {
                Tabla = "dbo_Trans_ReciboHonorarios_Cliente_Cab";
                Id = "Id_ReciboHonorarios_Cliente";
            }
                       

            string Query = @"

                UPDATE @@Tabla
	                SET XML = '@@XML'
	                WHERE @@Id_Documento = @@Id
            ";

            Query = Query.Replace("@@Id_Documento", Id);
            Query = Query.Replace("@@Tabla", Tabla);
            Query = Query.Replace("@@Id", Id_Documento.ToString());
            Query = Query.Replace("@@XML", @XML);

            return SrvDB.ExecuteQuery_Insert(Query);
        }

        public static Respuesta Insert_QR
        (
            Documentos_Id Tipo_Documento,
            OleDbCommand cmd
        )
        {
            string Tabla = "";
            string Id = "";

            if (Tipo_Documento == Documentos_Id.Doc_FacturaCliente)
            {
                Tabla = "dbo_Trans_Factura_Cliente_Cab";
                Id = "Id_Factura_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_DevolucionCliente)
            {
                Tabla = "dbo_Trans_Devolucion_Cliente_Cab";
                Id = "Id_Devolucion_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_NotaCreditoCliente)
            {
                Tabla = "dbo_Trans_Nota_Credito_Cliente_Cab";
                Id = "Id_Nota_Credito_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_ReciboArrendamientoVentas)
            {
                Tabla = "dbo_Trans_ReciboArrendamiento_Cliente_Cab";
                Id = "Id_ReciboArrendamiento_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_ReciboHonorariosVentas)
            {
                Tabla = "dbo_Trans_ReciboHonorarios_Cliente_Cab";
                Id = "Id_ReciboHonorarios_Cliente";
            }

            string Query = @"

                UPDATE @@Tabla
	                SET QR = @QR 
	                WHERE @@Id_Documento = @Id_Documento
            ".Replace("@@Tabla", Tabla).Replace("@@Id_Documento", Id);

            Query = Query.Replace("@@Id_Documento", Id);            
            Query = Query.Replace("@@Tabla", Tabla);

            cmd.CommandText = Query;

            return SrvDB.ExecuteQuery_Insert(cmd);
        }      

        public DataTable DatosTimbrar
        (
            int Id_Documento,
            Documentos_Id Tipo_Documento
        )
        {
            string Tabla = "";
            string Id = "";

            if (Tipo_Documento == Documentos_Id.Doc_FacturaCliente)
            {
                Tabla = "dbo_Trans_Factura_Cliente_Cab";
                Id = "Id_Factura_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_DevolucionCliente)
            {
                Tabla = "dbo_Trans_Devolucion_Cliente_Cab";
                Id = "Id_Devolucion_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_NotaCreditoCliente)
            {
                Tabla = "dbo_Trans_Nota_Credito_Cliente_Cab";
                Id = "Id_Nota_Credito_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_ReciboArrendamientoVentas)
            {
                Tabla = "dbo_Trans_ReciboArrendamiento_Cliente_Cab";
                Id = "Id_ReciboArrendamiento_Cliente";
            }
            else if (Tipo_Documento == Documentos_Id.Doc_ReciboHonorariosVentas)
            {
                Tabla = "dbo_Trans_ReciboHonorarios_Cliente_Cab";
                Id = "Id_ReciboHonorarios_Cliente";
            }

            string Query = @"

                SELECT

		                CFDi.Secuencia AS Folio,
		                ForP.Nombre AS FormaDePago,
		                CFDi.Subtotal AS Subtotal,
		                CFDi.Total AS Total,
		                MetP.Nombre AS MetodoDePago,
		                Estado_Sucursal.Nombre + ', ' + Pais_Sucursal.Nombre AS LugarExpedicion,
		                Serie.Nombre AS Serie,
		                TipoCambio.TipoCambio AS TipoDeCambio,
		                Moneda.Nombre AS Moneda,
			
		                CFDi.RFC AS RFC,
		                Sucursal.Calle AS Calle,
		                Sucursal.Municipio AS Municipio,
		                Estado_Sucursal.Nombre AS Estado,
		                Pais_Sucursal.Nombre AS Pais,
		                Sucursal.CP AS CodigoPostal,
		                Emp.Razon_Social AS Nombre,
		                Sucursal.Num_Ext AS NoExterior,
		                Sucursal.Num_Int AS NoInterior,
		                Sucursal.Colonia,	
		
		                Cli.RFC_Cliente AS RFC_Cliente,
		                Cli.Calle AS Calle_Cliente,
		                Cli.Municipio AS Municipio_Cliente,
		                Estado_Cliente.Nombre AS Estado_Cliente,
		                Pais_Cliente.Nombre AS Pais_Cliente,
		                Cli.CP AS CodigoPostal_Cliente,
		                Cli.Razon_Social AS Nombre_Cliente,
		                Cli.Num_Ext AS NoExterior_Cliente,
		                Cli.Num_Int AS NoInterior_Cliente,
		                Cli.Colonia AS Colonia_Cliente,
		
		                RegFis.Nombre AS RegimenFiscal,	
		
		                Certificado.CerFile AS CER_F,
		                Certificado.KeyFile AS KEY_F,
		                Certificado.[Password] AS PassW	

		                  FROM ((((((((((((((((@@Tabla AS CFDi
	                INNER JOIN dbo_Cat_Moneda AS Moneda ON CFDi.Id_Moneda = Moneda.Id_Moneda)
	                INNER JOIN dbo_Cat_TipoCambio AS TipoCambio ON TipoCambio.Id_Moneda = Moneda.Id_Moneda)
	                INNER JOIN dbo_Cat_Cliente AS Cli ON CFDi.Id_Cliente = Cli.Id_Cliente)
	                INNER JOIN dbo_Cat_Terminos_Pago AS TP ON TP.Id_Terminos_Pago = Cli.Id_Terminos_Pago)
	                INNER JOIN dbo_Cat_Empresa AS Emp ON Emp.RFC = CFDi.RFC)
	                INNER JOIN dbo_Cat_Empresa_Datos_Factura AS EmpFac ON EmpFac.RFC = CFDi.RFC)
	                INNER JOIN dbo_Cat_Regimen_Fiscal AS RegFis ON EmpFac.Id_Regimen_Fiscal = RegFis.Id_Regimen_Fiscal)
	                INNER JOIN dbo_Cat_Forma_Pago AS ForP ON ForP.Id_Forma_Pago = CFDi.Id_FormaPago)
	                INNER JOIN dbo_Cat_Metodo_Pago AS MetP ON MetP.Id_Metodo_Pago = CFDi.Id_MetodoPago)
	                INNER JOIN dbo_Cat_Sucursal AS Sucursal ON Sucursal.Id_Sucursal = CFDi.Id_Sucursal)
	                INNER JOIN dbo_Cat_Empresa_Serie AS Serie ON Serie.Id_Serie = CFDi.Id_Serie)
	                INNER JOIN dbo_Cat_Empresa_Certificado_FE AS Certificado ON Certificado.Id_Certificado_FE = Serie.Id_Certificado)
	                INNER JOIN dbo_Cat_SIIE_Estado AS Estado_Sucursal ON Estado_Sucursal.Id_SIIE_Estado = Sucursal.Id_Estado)
	                INNER JOIN dbo_Cat_SIIE_Pais AS Pais_Sucursal ON Pais_Sucursal.Id_SIIE_Pais = Sucursal.Id_Pais)
	                INNER JOIN dbo_Cat_SIIE_Estado AS Estado_Cliente ON Estado_Cliente.Id_SIIE_Estado = Cli.Id_Estado)
	                INNER JOIN dbo_Cat_SIIE_Pais AS Pais_Cliente ON Pais_Cliente.Id_SIIE_Pais = Cli.Id_Pais)

                    WHERE CFDi.@@Id_Documento = @@Id
            ";

            Query = Query.Replace("@@Id_Documento", Id);
            Query = Query.Replace("@@Id", Id_Documento.ToString());
            Query = Query.Replace("@@Tabla", Tabla);
                        
            return SrvDB.ExecuteQuery_Get(Query);
        }



        public DataTable DatosTimbrarLineas
        (
            int Id_Documento,
            Documentos_Id Tipo_Documento
        )
        {
            
            string Query = "";
            if (Tipo_Documento == Documentos_Id.Doc_FacturaCliente)
            {
                Query = @"

                SELECT 
                   CFDi.Cantidad AS Cantidad, 
		                   UM.Nombre AS UnidadMedida, 
		                   A.Nombre AS ArticuloNombre,
		                   CFDi.Precio_Unitario AS Total,
		                   CFDi.Impuesto AS Impuesto ,
		                   CFDi.Porc_Impuesto AS Porc_Impuesto

	                FROM ((dbo_Trans_Factura_Cliente_Linea AS CFDi
	                INNER JOIN dbo_Cat_Articulo AS A ON A.Id_Articulo = CFDi.Id_Articulo)
	                INNER JOIN dbo_Cat_UM AS UM ON UM.Id_UM = A.Id_UM)	

                    WHERE CFDi.Id_Padre = @@Id
                ".Replace("@@Id", Id_Documento.ToString());
            }
            else if (Tipo_Documento == Documentos_Id.Doc_DevolucionCliente)
            {
                Query = @"

                SELECT 
                   CFDi.Cantidad AS Cantidad, 
		                   UM.Nombre AS UnidadMedida, 
		                   A.Nombre AS ArticuloNombre,
		                   CFDi.Precio_Unitario  AS Total,
		                   CFDi.Impuesto AS Impuesto ,
		                   CFDi.Porc_Impuesto AS Porc_Impuesto

	                FROM ((dbo_Trans_Devolucion_Cliente_Linea AS CFDi
	                INNER JOIN dbo_Cat_Articulo AS A ON A.Id_Articulo = CFDi.Id_Articulo)
	                INNER JOIN dbo_Cat_UM AS UM ON UM.Id_UM = A.Id_UM)	

                    WHERE CFDi.Id_Padre = @@Id
                ".Replace("@@Id", Id_Documento.ToString());
            }
            else if (Tipo_Documento == Documentos_Id.Doc_NotaCreditoCliente)
            {
                Query = @"

                SELECT 
                   CFDi.Cantidad AS Cantidad, 
		                   'NA' AS UnidadMedida, 
		                   'Monto de nota de crédito' AS ArticuloNombre,
		                   CFDi.Precio_Unitario AS Total,
		                   CFDi.Impuesto AS Impuesto ,
		                   CFDi.Porc_Impuesto AS Porc_Impuesto

	                FROM dbo_Trans_Nota_Credito_Cliente_Linea AS CFDi	                

                    WHERE CFDi.Id_Padre = @@Id
                ".Replace("@@Id", Id_Documento.ToString());
            }
            else if (Tipo_Documento == Documentos_Id.Doc_ReciboArrendamientoVentas)
            {
                Query = @"

                    SELECT 
		                       'NA' AS UnidadMedida, 
		                       A.Nombre AS ArticuloNombre,	   
		   
		                       CFDi.Cantidad AS Cantidad,
		                       CFDi.ISRRet AS ISRRet,
		                       CFDi.IVA AS IVA,
		                       CFDi.IVARet AS IVARet,
		                       CFDi.Porc_ISRRet AS Porc_ISRRet,
		                       CFDi.Porc_IVA AS Porc_IVA,
		                       CFDi.Porc_IVARet AS Porc_IVARet,
		                       CFDi.Precio_SubTotal AS Precio_SubTotal,
		                       CFDi.Precio_Total AS Precio_Total,
		                       CFDi.Precio_Unitario AS Precio_Unitario
		   

	                    FROM (dbo_Trans_ReciboArrendamiento_Cliente_Linea AS CFDi
	                    INNER JOIN dbo_Cat_Inmueble AS A ON A.Id_Inmueble = CFDi.Id_Articulo)
	                    
                        WHERE CFDi.Id_Padre = @@Id
                ".Replace("@@Id", Id_Documento.ToString());
            }
            else if (Tipo_Documento == Documentos_Id.Doc_ReciboHonorariosVentas)
            {                
                Query = @"
                    
                    SELECT 
		                   'NA' AS UnidadMedida, 
		                   'Arrendamiento de Inmueble' AS ArticuloNombre,	   
		   
		                   CFDi.Cantidad AS Cantidad,
		                   CFDi.ISRRet AS ISRRet,
		                   CFDi.IVA AS IVA,
		                   CFDi.IVARet AS IVARet,
		                   CFDi.Porc_ISRRet AS Porc_ISRRet,
		                   CFDi.Porc_IVA AS Porc_IVA,
		                   CFDi.Porc_IVARet AS Porc_IVARet,
		                   CFDi.Precio_SubTotal AS Precio_SubTotal,
		                   CFDi.Precio_Total AS Precio_Total,
		                   CFDi.Precio_Unitario AS Precio_Unitario
		   

	                FROM dbo_Trans_ReciboHonorarios_Cliente_Linea AS CFDi	
                    WHERE CFDi.Id_Padre = @@Id
                    ".Replace("@@Id", Id_Documento.ToString());
            }

            return SrvDB.ExecuteQuery_Get(Query);
        }        
    }
}
